//
//  ViewController.m
//  27-Block
//
//  Created by mafeng on 16/8/19.
//  Copyright © 2016年 mafeng. All rights reserved.
//

#import "ViewController.h"
#import "SecViewController.h"
@interface ViewController ()
// Block写在属性中
@property (nonatomic, copy) void (^XXblock)(void);
// block写在方法中
- (void)handleData:(void (^)(void))data;
@property (retain, nonatomic) IBOutlet UILabel *textLabel;
@end

@implementation ViewController

- (void)handleData:(void (^)(void))data {
    data();
}

- (IBAction)click:(id)sender {
    SecViewController *secVC = [[SecViewController alloc] init];
    // 值传递, 需要实现block
    // 告诉block, 该指针为弱引用
    SecViewController * __block weakSecVC = secVC;
    secVC.passTitle = ^(NSString *title) {
        // Block会对内部的所有对象进行强引用
        self.textLabel.text = title;
        weakSecVC.view.backgroundColor = [UIColor blackColor];
    };
    [self.navigationController pushViewController:secVC animated:YES];
    [secVC release];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1. Block 是什么?  消息传递机制之一
    // Block 与 函数相似, 有固定功能的代码段
    // 2. Block 基本语法
    // int a;
    // 1> block声明
    // 类型 void (^)(void)  变量名: block
    // 返回值类型 (^ block名)(参数列表);
    void (^block)(void);
    // 2> block赋值
    // block变量 = ^(参数列表) { 固定的代码段 }
    block = ^(void) {
        
    };
    
    // 3. block的几种形式
    // 有参有返回
    id (^block1) (id);
    block1 = ^(id a) {
        return a;
    };
    // 无参无返回
    void (^block2) (void) = ^(void) {
        
    };
    // 简洁写法
    void (^block5) () = ^{
        self.view.backgroundColor = [UIColor cyanColor];
    };
    // 有参无返回
    void (^block3) (int number) = ^(int number) {
        
    };
    // 无参又返回
    id (^block4)(void) = ^{
        return @"hahh";
    };
    // 系统提供的代码段可以直接使用, inlineBlock
//    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//        <#statements#>
//    };
    // 4.Block的调用
    block1(@10);
    block5();
    // 5.系统中的block
    //  1> 模态 (void (^ __nullable)(void))completion
//    [self presentViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#> completion:<#^(void)completion#>];
    //  2> GCD  void (^dispatch_block_t)(void)
    // dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
    //  3> 系统网络请求 void (^)(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error)
//    [[NSURLSession sharedSession] dataTaskWithRequest:<#(nonnull NSURLRequest *)#> completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>];
    // 6.block写在属性和方法上
    // 属性block修饰符, 使用copy
    self.XXblock = block5;
    self.XXblock();  // get方法
    // 带block的方法的属性
    [self handleData:^{
        
    }];
    // 7. Block类型修饰符
    // __block __weak __strong
    //
    // 1> __block 在ARC下和MRC下有区别
    // ARC下和MRC下都可以修改外部变量
    // 可以在block内部修改外部变量
    // ARC下不能避免循环引用的问题 用__weak
    // MRC下可以
    int __block a = 0;
    void (^blockTest)() = ^{
        a = 100;
    };
    
    // 2> _weak 修饰Block外的变量
    //   只能在ARC下用, 避免Block的循环引用
    
    // 3> __strong 强引用
    
    
    
    
    
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
